---
sidebar_position: 1
id: lectures-gitcicd-version-control-intro
slug: lectures/gitcicd/version-control
---

# Что такое контроль версий?

## Контроль версий и системы контроля версий

**Контроль версий** (англ. version control), также известный как контроль исходного кода (англ. source control), - это практика отслеживания и управления изменениями в программном коде.

**Системы контроля версий** (англ. version control systems) - это программные инструменты, которые помогают группам разработчиков управлять изменениями исходного кода с течением времени. Системы контроля версий помогают командам разработчиков работать быстрее и умнее. Они особенно полезны для команд, использующие DevOps, поскольку помогают им сократить время разработки и увеличить количество успешных развертываний.

*Иллюстрация контроля версий (источник: [bitbucket.org](https://bitbucket.org/product/version-control-software))*:

![Контроль версий](images/version-control.svg)

Программное обеспечение для контроля версий отслеживает каждое изменение кода в специальной базе данных. Если допущена ошибка, разработчики могут откатиться и вернуться к более ранним версиям кода, чтобы помочь исправить ошибку. При этом минимизируется простой всех членов команды.

Почти для всех программных проектов исходный код подобен драгоценностям на короне - драгоценному активу, ценность которого должна быть защищена. Для большинства программистов исходный код является хранилищем бесценных знаний и понимания предметной области, которые разработчики собрали и усовершенствовали благодаря тщательным усилиям. Контроль версий защищает исходный код как от происшествий, так и от случайных ухудшений из-за человеческих ошибок и непреднамеренных последствий.

Разработчики программного обеспечения, работающие в командах, постоянно пишут новый исходный код и изменяют существующий исходный код. Код проекта, приложения или программного компонента обычно организован в виде структуры папок или "дерева файлов". Один разработчик в команде может работать над новой функцией, в то время как другой разработчик исправляет несвязанную ошибку, изменяя код. Каждый разработчик может вносить свои изменения в несколько частей дерева файлов.

Контроль версий помогает командам решать проблемы такого рода, отслеживая каждое отдельное изменение каждого участника и помогая предотвратить конфликты при одновременной работе. Изменения, внесенные в одну часть программного обеспечения, могут быть несовместимы с изменениями, внесенными другим разработчиком, работающим в то же время. Эта проблема должна быть обнаружена и решена упорядоченным образом, не блокируя работу остальной части команды. Кроме того, при разработке любого программного обеспечения любое изменение само по себе может привести к появлению новых ошибок, и новому программному обеспечению нельзя доверять, пока оно не протестировано. Итак, тестирование и разработка продолжаются вместе, пока не будет готова новая версия.

Хорошее программное обеспечение для контроля версий поддерживает предпочтительный рабочий процесс разработчика, не навязывая один конкретный способ работы. В идеале он также работает на любой платформе, а не диктует, какую операционную систему или цепочку инструментов должны использовать разработчики. Отличные системы контроля версий способствуют плавному и непрерывному внесению изменений в код, а не разочаровывающему и неуклюжему механизму блокировки файлов - давая зеленый свет одному разработчику за счет блокирования прогресса других.

Команды разработчиков, которые не используют какую-либо форму контроля версий, часто сталкиваются с такими проблемами, как незнание того, какие внесенные изменения доступны пользователям, или создание несовместимых изменений между двумя несвязанными частями работы, которые затем должны быть тщательно распутаны и переработаны. Если вы разработчик, который никогда не использовал контроль версий, возможно, вы добавили версии в свои файлы, возможно, с суффиксами типа "final" или "latest", а затем вам пришлось позже иметь дело с новой окончательной версией "actually final". Возможно, вы закомментировали блоки кода, потому что хотите отключить определенные функции, не удаляя код, опасаясь, что это может быть использовано позже. Контроль версий - это выход из этих проблем.

*Настоящая система отслеживания изменений*:

![New directory](images/new-directory-meme.jpg)

Программное обеспечение для контроля версий является неотъемлемой частью повседневной профессиональной деятельности современной команды разработчиков программного обеспечения. Отдельные разработчики программного обеспечения, которые привыкли работать с надежной системой контроля версий в своих командах, обычно осознают невероятную ценность контроля версий даже в небольших сольных проектах. Привыкнув к мощным преимуществам систем контроля версий, многие разработчики не рассматривают возможность работы без нее даже для проектов, не связанных с программным обеспечением.

## Преимущества систем контроля версий

Использование программного обеспечения для управления версиями - лучшая практика для высокопроизводительных программ и команд DevOps. Контроль версий также помогает разработчикам двигаться быстрее и позволяет группам разработчиков сохранять эффективность и гибкость, поскольку команда расширяется, чтобы включать в себя больше разработчиков.

Системы контроля версий (VCS) значительно улучшились за последние несколько десятилетий, и некоторые из них лучше других. VCS иногда называют инструментами SCM (от англ. source control management - управление исходным кодом) или RCS (от англ. revision control system - система контроля изменений). Один из самых популярных инструментов VCS, используемых сегодня, называется Git. **Git** - это распределенный VCS, категория, известная как DVCS (от англ. distributed version control system - распределённая система управления версиями), подробнее об этом позже. Как и многие из самых популярных систем VCS, доступных сегодня, Git является бесплатным и с открытым исходным кодом. Независимо от того, как они называются или какая система используется, основные преимущества, которые вы должны ожидать от контроля версий, заключаются в следующем.

*Распределённая система управления версиями (источник: [bitbucket.org](https://bitbucket.org/product/version-control-software))*:

![Распределенный VCS](images/distributed.png)

*Централизованная система управления версиями (источник: [bitbucket.org](https://bitbucket.org/product/version-control-software))*:

![Централизованный VCS](images/centralized.png)

Можно выделить следующие преимущества VCS:

1. **Полная долгосрочная история изменений каждого файла**. Это означает, что имеется полная история изменения файла, когда-либо внесенными любым членом команды в любой момент. Изменения включают создание и удаление файлов, а также редактирование их содержимого. Различные инструменты VCS отличаются тем, насколько хорошо они обрабатывают переименование и перемещение файлов. Эта история также должна включать автора, дату и письменные примечания о цели каждого изменения. Наличие полной истории позволяет вернуться к предыдущим версиям, чтобы помочь в анализе первопричин ошибок, и это крайне важно при необходимости устранения проблем в старых версиях программного обеспечения. Если над программным обеспечением ведется активная работа, почти все можно считать "старой версией" программного обеспечения.
2. **Ветвление и слияние**. Наличие одновременной работы нескольких членов команды не составляет труда, но даже люди, работающие самостоятельно, могут извлечь выгоду из возможности работать с независимыми потоками изменений. Создание "ветки" в VCS позволяет нескольким потокам работы оставаться независимыми друг от друга, а также предоставляет возможность объединить эту работу вместе, позволяя разработчикам проверять, что изменения в каждой ветке не конфликтуют. Многие команды разработчиков программного обеспечения применяют практику ветвления для каждой функции или, возможно, ветвления для каждого выпуска, или и то, и другое. Существует множество различных рабочих процессов, из которых команды могут выбирать, когда решают, как использовать возможности ветвления и объединения в VCS.
3. **Отслеживаемость**. Возможность отслеживать каждое изменение, внесенное в программное обеспечение, и подключать его к программному обеспечению для управления проектами и отслеживания ошибок, таким как Jira, а также возможность сопровождать каждое изменение сообщением, описывающим цель и намерение изменения, может помочь не только в анализе первопричин и других исследованиях. Имея под рукой аннотированную историю кода, когда вы читаете код, пытаясь понять, что он делает и почему он так разработан, может позволить разработчикам вносить правильные и гармоничные изменения, которые соответствуют предполагаемому долгосрочному дизайну системы. Это может быть особенно важно для эффективной работы с устаревшим кодом и имеет решающее значение для того, чтобы разработчики могли оценивать будущую работу с любой точностью.

Хотя возможно разрабатывать программное обеспечение без использования какого-либо контроля версий, это подвергает проект огромному риску, который не рекомендуется принимать профессиональной команде. Итак, вопрос не в том, использовать ли контроль версий, а в том, какую систему контроля версий использовать.

Есть много вариантов, но здесь мы сосредоточимся только на одном, Git.

## Вывод

Контроль версий позволяет получить:

- **Качество**. Команды могут просматривать, комментировать и улучшать код и ресурсы друг друга.
- **Ускорение**. Быстрее распределяется работа, вносятся изменения и объединяются результаты изменений.
- **Видимость**. Понимание и стимулирование совместной работы команды для улучшения шаблонов сборки и выпуска версий.

## Атрибуция

При подготовке статьи использован материал:

- [atlassian.com/git/tutorials](https://www.atlassian.com/git/tutorials/)
- [about.gitlab.com/topics/version-control](https://about.gitlab.com/topics/version-control/)
